/*
 * @Author: lmh
 * @Date: 2021-09-05 12:07:02
 * @LastEditTime: 2021-09-05 14:01:17
 * @LastEditors: lmh
 * @Description: Promise
 */

// Promise 是异步编程的一种解决方案：
// 1、从语法上讲，promise是一个对象，从它可以获取异步操作的消息；
// 2、从本意上讲，它是承诺，承诺它过一段时间会给你一个结果。
// 3、promise有三种状态：pending(等待态)，fulfiled(成功态)，rejected(失败态)；
// 4、状态一旦改变，就不会再变。
// 5、创造promise实例后，它会立即执行

let p = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log('执行完成')
        resolve('我是成功！！')
        // reject('我是失败！！')
    }, 1000)
})
p.then(data => {
    console.log(data);
}).then(data => {
    console.log(data)
}).catch(err => {
    console.log(err)
})

let q = new Promise((resolve, reject) => {
    setTimeout(function () {
        var num = Math.ceil(Math.random() * 10); //生成1-10的随机数
        if (num <= 5) {
            resolve(num);
        }
        else {
            reject('数字太大了');
        }
    }, 1000)
})
q.then((data) => {
    console.log('q-resolved', data);
    console.log('-------------------------------------------');
}, (err) => {
    console.log('q-rejected', err);
    console.log('-------------------------------------------');
}
);

// all的用法：谁跑的慢，以谁为准执行回调。all接收一个数组参数，里面的值最终都算返回Promise对象
// 注：只要任何一个输入的promise的reject回调执行
//   或者 输入不合法的promise就会立即抛出错误，并且reject的是第一个抛出的错误信息。
let Promise1 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        console.log('promise1开始')
        var num = Math.ceil(Math.random() * 10); //生成1-10的随机数
        if (num <= 5) {
            resolve('promise1 ' + num);
        }
        else {
            // resolve('promise1 数字太大了');
            reject('promise1 数字太大了');
        }
    }, 1000);
})
let Promise2 = new Promise(function (resolve, reject) { 
    setTimeout(function () {
        console.log('promise2开始')
        var num = Math.ceil(Math.random() * 10); //生成1-10的随机数
        if (num <= 5) {
            resolve('promise2 ' + num);
        }
        else {
            // resolve('promise2 数字太大了');
            reject('promise2 数字太大了');
        }
    }, 2000);
})
let Promise3 = new Promise(function (resolve, reject) { 
    setTimeout(function () {
        console.log('promise3开始')
        var num = Math.ceil(Math.random() * 10); //生成1-10的随机数
        if (num <= 5) {
            resolve('promise3 ' + num);
        }
        else {
            // resolve('promise3 数字太大了');
            reject('promise3 数字太大了');
        }
    }, 3000);
})
let y = Promise.all([Promise1, Promise2, Promise3])
y.then(data => {
    console.log('all-', data)
}).catch(err => {
    console.log('all-', err)
})

// 谁跑的快，以谁为准执行回调
// 注：同all
let x = Promise.race([Promise1, Promise2, Promise3])
x.then(data => {
    console.log('race-', data)
}).catch(err => {
    console.log('race-', err)
})
